其他
tianai-captcha:开源界最好用的行为验证码
每天给大家带来网站工具、安卓软件、iOS软件、开源社区项目等黑科技!
如果你们有什么好的建议,也可以在后台留言。
创作不易,希望大家给一点鼓励,把公众号设置为"星标",点下文章"在看",谢谢大家!目前佛系更新,望多多支持~
小编今天发现一个有趣的开源验证码库:tianai-captcha,能够生成各种行为验证码,好看又好用。目前支持的验证码类型有滑块验证码、旋转验证码、文字点选验证码、滑动还原、旋转角度验证、刮刮乐(beta),图标点选、语序点选等等。
✨整体架构设计
tianai-captcha 验证码整体分为:
主要负责生成行为验证码所需的图片
主要负责校验用户滑动的行为轨迹是否合规
主要负责读取验证码背景图片和模板图片等
资源存储(ResourceStore)
负责存储背景图和模板图
资源提供者(ResourceProvider)
负责将资源存储器中对应的资源转换为文件流
一般资源存储器中存储的是图片的url地址或者id之类,资源提供者 就是负责将url或者别的id转换为真正的图片文件
🚚集成 Springboot
如果使用Springboot,可以使用官方提供的SpringBoot脚手架工具:tianai-captcha-springboot-starter。该工具对tianai-captcha验证码进行了封装,使用更加方便快捷。
<!-- maven导入 -->
<dependency>
<groupId>cloud.tianai.captcha</groupId>
<artifactId>tianai-captcha-springboot-starter</artifactId>
<version>1.4.1</version>
</dependency>
package cloud.tianai.captcha.readme;
import cloud.tianai.captcha.common.constant.CaptchaTypeConstant;
import cloud.tianai.captcha.spring.application.CaptchaImageType;
import cloud.tianai.captcha.spring.application.ImageCaptchaApplication;
import cloud.tianai.captcha.spring.vo.CaptchaResponse;
import cloud.tianai.captcha.spring.vo.ImageCaptchaVO;
import cloud.tianai.captcha.validator.common.model.dto.ImageCaptchaTrack;
import org.springframework.beans.factory.annotation.Autowired;
public class Test2 {
@Autowired
private ImageCaptchaApplication application;
public void test() {
// 1.生成滑块验证码(该数据返回给前端用于展示验证码数据)
CaptchaResponse<ImageCaptchaVO> res1 = application.generateCaptcha(CaptchaTypeConstant.SLIDER);
// 2.前端滑动完成后把数据传入后端进行校验是否通过,
// 参数1: 生成的验证码对应的id, 由前端传过来
// 参数2: 滑动轨迹验证码相关数据 ImageCaptchaTrack, 由前端传过来
// 返回 match.isSuccess() 如果为true, 则验证通过
ImageCaptchaTrack sliderCaptchaTrack = new ImageCaptchaTrack();
ApiResponse<?> match = application.matching(res1.getId(), sliderCaptchaTrack);
}
}
① 配置yaml文件如下:
# 滑块验证码配置, 详细请看 cloud.tianai.captcha.autoconfiguration.ImageCaptchaProperties 类
captcha:
# 如果项目中使用到了redis,滑块验证码会自动把验证码数据存到redis中, 这里配置redis的key的前缀,默认是captcha:slider
prefix: captcha
# 验证码过期时间,默认是2分钟,单位毫秒, 可以根据自身业务进行调整
expire:
# 默认缓存时间 2分钟
default: 10000
# 针对 点选验证码 过期时间设置为 2分钟, 因为点选验证码验证比较慢,把过期时间调整大一些
WORD_IMAGE_CLICK: 20000
# 使用加载系统自带的资源, 默认是 false
init-default-resource: false
cache:
# 缓存控制, 默认为false不开启
enabled: true
# 验证码会提前缓存一些生成好的验证数据, 默认是20
cacheSize: 20
# 缓存拉取失败后等待时间 默认是 5秒钟
wait-time: 5000
# 缓存检查间隔 默认是2秒钟
period: 2000
secondary:
# 二次验证, 默认false 不开启
enabled: false
# 二次验证过期时间, 默认 2分钟
expire: 120000
# 二次验证缓存key前缀,默认是 captcha:secondary
keyPrefix: "captcha:secondary"
② 二次验证
package cloud.tianai.captcha.readme;
import cloud.tianai.captcha.spring.application.ImageCaptchaApplication;
import cloud.tianai.captcha.spring.plugins.secondary.SecondaryVerificationApplication;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
public class Test3 {
@Autowired
private ImageCaptchaApplication sca;
@GetMapping("/check2")
@ResponseBody
public boolean check2Captcha(@RequestParam("id") String id) {
// 如果开启了二次验证
if (sca instanceof SecondaryVerificationApplication) {
return ((SecondaryVerificationApplication) sca).secondaryVerification(id);
}
return false;
}
}
③ 添加自定义模板/背景图片
添加模板使用 addTemplate(type1, template1) 方法
添加背景图片使用 addResource(type1, res1)方法
package cloud.tianai.captcha.demo;
import cloud.tianai.captcha.common.constant.CaptchaTypeConstant;
import cloud.tianai.captcha.generator.common.constant.SliderCaptchaConstant;
import cloud.tianai.captcha.generator.impl.StandardSliderImageCaptchaGenerator;
import cloud.tianai.captcha.resource.common.model.dto.Resource;
import cloud.tianai.captcha.resource.common.model.dto.ResourceMap;
import cloud.tianai.captcha.resource.impl.DefaultResourceStore;
import cloud.tianai.captcha.resource.impl.provider.ClassPathResourceProvider;
import org.springframework.stereotype.Component;
import static cloud.tianai.captcha.generator.impl.StandardSliderImageCaptchaGenerator.DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH;
/**
* 负责模板和背景图存储的地方
*/
@Component
public class MyResourceStore extends DefaultResourceStore {
public MyResourceStore() {
// 滑块验证码 模板 (系统内置)
ResourceMap template1 = new ResourceMap("default",4);
template1.put(SliderCaptchaConstant.TEMPLATE_ACTIVE_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH.concat("/1/active.png")));
template1.put(SliderCaptchaConstant.TEMPLATE_FIXED_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH.concat("/1/fixed.png")));
ResourceMap template2 = new ResourceMap("default",4);
template2.put(SliderCaptchaConstant.TEMPLATE_ACTIVE_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH.concat("/2/active.png")));
template2.put(SliderCaptchaConstant.TEMPLATE_FIXED_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH.concat("/2/fixed.png")));
// 旋转验证码 模板 (系统内置)
ResourceMap template3 = new ResourceMap("default",4);
template3.put(SliderCaptchaConstant.TEMPLATE_ACTIVE_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, StandardSliderImageCaptchaGenerator.DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH.concat("/3/active.png")));
template3.put(SliderCaptchaConstant.TEMPLATE_FIXED_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, StandardSliderImageCaptchaGenerator.DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH.concat("/3/fixed.png")));
// 1. 添加一些模板
addTemplate(CaptchaTypeConstant.SLIDER, template1);
addTemplate(CaptchaTypeConstant.SLIDER, template2);
addTemplate(CaptchaTypeConstant.ROTATE, template3);
// 2. 添加自定义背景图片
addResource(CaptchaTypeConstant.SLIDER, new Resource("classpath", "bgimages/a.jpg","default"));
addResource(CaptchaTypeConstant.SLIDER, new Resource("classpath", "bgimages/b.jpg","default"));
addResource(CaptchaTypeConstant.SLIDER, new Resource("classpath", "bgimages/c.jpg","default"));
addResource(CaptchaTypeConstant.SLIDER, new Resource("classpath", "bgimages/d.jpg","default"));
addResource(CaptchaTypeConstant.SLIDER, new Resource("classpath", "bgimages/e.jpg","default"));
addResource(CaptchaTypeConstant.SLIDER, new Resource("classpath", "bgimages/g.jpg","default"));
addResource(CaptchaTypeConstant.SLIDER, new Resource("classpath", "bgimages/h.jpg","default"));
addResource(CaptchaTypeConstant.SLIDER, new Resource("classpath", "bgimages/i.jpg","default"));
addResource(CaptchaTypeConstant.SLIDER, new Resource("classpath", "bgimages/j.jpg","default"));
addResource(CaptchaTypeConstant.ROTATE, new Resource("classpath", "bgimages/48.jpg","default"));
addResource(CaptchaTypeConstant.CONCAT, new Resource("classpath", "bgimages/48.jpg","default"));
addResource(CaptchaTypeConstant.WORD_IMAGE_CLICK, new Resource("classpath", "bgimages/c.jpg","default"));
}
}
🍄最后贴上官方相关链接
https://github.com/tianaiyouqing/tianai-captcha-demo
END
👨🎓聊一聊
公众号推送改版,务必点击【爱编程爱技术】右上角【设为星标🌟】,这样才不会错过推送。
如果侵犯了您的权益,请点击菜单栏联系公众号,一经核实,我们会在最短的时间内删除!感谢理解!
该系列软件虽经本人亲测可用,但难免有疏忽之处,一旦您下载使用此软件,后续风险需自行承担,发布者本人不对使用此资源负任何责任!
点点关注不迷路
本文发表于公众号【爱编程爱技术】
往期推荐: